home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / ZSI / TCcompound.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  18KB  |  533 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from ZSI import _copyright, _children, _child_elements, _inttypes, _stringtypes, _seqtypes, _find_arraytype, _find_href, _find_type, _find_xmlns_prefix, _get_idstr, EvaluateException, ParseException
  5. from TC import _get_element_nsuri_name, _get_xsitype, TypeCode, Any, AnyElement, AnyType, Nilled, UNBOUNDED
  6. from schema import GED, ElementDeclaration, TypeDefinition, _get_substitute_element, _get_type_definition, _is_substitute_element
  7. from ZSI.wstools.Namespaces import SCHEMA, SOAP
  8. from ZSI.wstools.Utility import SplitQName
  9. from ZSI.wstools.logging import getLogger as _GetLogger
  10. import re
  11. import types
  12. from copy import copy as _copy
  13.  
  14. _find_arrayoffset = lambda E: E.getAttributeNS(SOAP.ENC, 'offset')
  15.  
  16. _find_arrayposition = lambda E: E.getAttributeNS(SOAP.ENC, 'position')
  17. _offset_pat = re.compile('\\[[0-9]+\\]')
  18. _position_pat = _offset_pat
  19.  
  20. def _check_typecode_list(ofwhat, tcname):
  21.     for o in ofwhat:
  22.         if callable(o):
  23.             continue
  24.         
  25.         if not isinstance(o, TypeCode):
  26.             raise TypeError(tcname + ' ofwhat outside the TypeCode hierarchy, ' + str(o.__class__))
  27.         
  28.         if o.pname is None and not isinstance(o, AnyElement):
  29.             raise TypeError(tcname + ' element ' + str(o) + ' has no name')
  30.             continue
  31.     
  32.  
  33.  
  34. def _get_type_or_substitute(typecode, pyobj, sw, elt):
  35.     sub = getattr(pyobj, 'typecode', typecode)
  36.     if sub is typecode or sub is None:
  37.         return typecode
  38.     
  39.     if isinstance(typecode, AnyElement):
  40.         return sub
  41.     
  42.     if isinstance(sub, ElementDeclaration):
  43.         if (typecode.nspname, typecode.pname) == (sub.nspname, sub.pname):
  44.             raise TypeError('bad usage, failed to serialize element reference (%s, %s), in: %s' % (typecode.nspname, typecode.pname, sw.Backtrace(elt)))
  45.         
  46.         if _is_substitute_element(typecode, sub):
  47.             return sub
  48.         
  49.         raise TypeError('failed to serialize (%s, %s) illegal sub GED (%s,%s): %s' % (typecode.nspname, typecode.pname, sub.nspname, sub.pname, sw.Backtrace(elt)))
  50.     
  51.     if not isinstance(typecode, AnyType) and not isinstance(sub, typecode.__class__):
  52.         raise TypeError('failed to serialize substitute %s for %s,  not derivation: %s' % (sub, typecode, sw.Backtrace(elt)))
  53.     
  54.     sub = _copy(sub)
  55.     sub.nspname = typecode.nspname
  56.     sub.pname = typecode.pname
  57.     sub.aname = typecode.aname
  58.     sub.minOccurs = sub.maxOccurs = 1
  59.     return sub
  60.  
  61.  
  62. class ComplexType(TypeCode):
  63.     logger = _GetLogger('ZSI.TCcompound.ComplexType')
  64.     
  65.     def __init__(self, pyclass, ofwhat, pname = None, inorder = False, inline = False, mutable = True, mixed = False, mixed_aname = '_text', **kw):
  66.         TypeCode.__init__(self, pname, pyclass = pyclass, **kw)
  67.         self.inorder = inorder
  68.         self.inline = inline
  69.         self.mutable = mutable
  70.         self.mixed = mixed
  71.         self.mixed_aname = None
  72.         if mixed is True:
  73.             self.mixed_aname = mixed_aname
  74.         
  75.         if self.mutable is True:
  76.             self.inline = True
  77.         
  78.         if not kw.get('type'):
  79.             pass
  80.         self.type = _get_xsitype(self)
  81.         t = type(ofwhat)
  82.         if t not in _seqtypes:
  83.             raise TypeError('Struct ofwhat must be list or sequence, not ' + str(t))
  84.         
  85.         self.ofwhat = tuple(ofwhat)
  86.         if TypeCode.typechecks:
  87.             if self.pyclass is not None and type(self.pyclass) is not types.ClassType and not isinstance(self.pyclass, object):
  88.                 raise TypeError('pyclass must be None or an old-style/new-style class, not ' + str(type(self.pyclass)))
  89.             
  90.             _check_typecode_list(self.ofwhat, 'ComplexType')
  91.         
  92.  
  93.     
  94.     def parse(self, elt, ps):
  95.         debug = self.logger.debugOn()
  96.         if debug:
  97.             pass
  98.         self.logger.debug('parse')
  99.         xtype = self.checkname(elt, ps)
  100.         if self.type and xtype not in [
  101.             self.type,
  102.             (None, None)]:
  103.             None if not isinstance(self, TypeDefinition) else self.logger.debug('delegate to substitute type')
  104.             what = TypeDefinition.getSubstituteType(self, elt, ps)
  105.             return what.parse(elt, ps)
  106.         
  107.         href = _find_href(elt)
  108.         if href:
  109.             if _children(elt):
  110.                 raise EvaluateException('Struct has content and HREF', ps.Backtrace(elt))
  111.             
  112.             elt = ps.FindLocalHREF(href, elt)
  113.         
  114.         c = _child_elements(elt)
  115.         count = len(c)
  116.         if self.nilled(elt, ps):
  117.             return Nilled
  118.         
  119.         v = { }
  120.         attributes = self.parse_attributes(elt, ps)
  121.         if attributes:
  122.             v[self.attrs_aname] = attributes
  123.         
  124.         if self.mixed is True:
  125.             v[self.mixed_aname] = self.simple_value(elt, ps, mixed = True)
  126.         
  127.         c = c[:]
  128.         crange = range(len(c))
  129.         if debug:
  130.             self.logger.debug('ofwhat: %s', str(self.ofwhat))
  131.         
  132.         any = None
  133.         for i in range(len(self.ofwhat)):
  134.             pass
  135.         
  136.         if any is not None:
  137.             occurs = 0
  138.             v[any.aname] = []
  139.             for j in crange:
  140.                 if c[j]:
  141.                     continue
  142.                 _[3][(j, c[j])]
  143.             
  144.             if any.maxOccurs == 1 and occurs == 0:
  145.                 v[any.aname] = None
  146.             elif (occurs < any.minOccurs or any.maxOccurs != UNBOUNDED) and any.maxOccurs < occurs:
  147.                 raise EvaluateException('occurances of <any> elements(#%d) bound by (%d,%s)' % (occurs, any.minOccurs, str(any.maxOccurs)), ps.Backtrace(elt))
  148.             
  149.         
  150.         if not self.pyclass:
  151.             return v
  152.         
  153.         
  154.         try:
  155.             pyobj = self.pyclass()
  156.         except Exception:
  157.             e = None
  158.             raise TypeError('Constructing element (%s,%s) with pyclass(%s), %s' % (self.nspname, self.pname, self.pyclass.__name__, str(e)))
  159.  
  160.         for key in v.keys():
  161.             setattr(pyobj, key, v[key])
  162.         
  163.         return pyobj
  164.  
  165.     
  166.     def serialize(self, elt, sw, pyobj, inline = False, name = None, **kw):
  167.         if inline or self.inline:
  168.             self.cb(elt, sw, pyobj, name = name, **kw)
  169.         else:
  170.             objid = _get_idstr(pyobj)
  171.             (ns, n) = self.get_name(name, objid)
  172.             el = elt.createAppendElement(ns, n)
  173.             el.setAttributeNS(None, 'href', '#%s' % objid)
  174.             sw.AddCallback(self.cb, elt, sw, pyobj)
  175.  
  176.     
  177.     def cb(self, elt, sw, pyobj, name = None, **kw):
  178.         debug = self.logger.debugOn()
  179.         if debug:
  180.             self.logger.debug('cb: %s' % str(self.ofwhat))
  181.         
  182.         objid = _get_idstr(pyobj)
  183.         (ns, n) = self.get_name(name, objid)
  184.         if pyobj is None:
  185.             if self.nillable is True:
  186.                 elem = elt.createAppendElement(ns, n)
  187.                 self.serialize_as_nil(elem)
  188.                 return None
  189.             
  190.             raise EvaluateException, 'element(%s,%s) is not nillable(%s)' % (self.nspname, self.pname, self.nillable)
  191.         
  192.         if self.mutable is False and sw.Known(pyobj):
  193.             return None
  194.         
  195.         if debug:
  196.             self.logger.debug('element: (%s, %s)', str(ns), n)
  197.         
  198.         if n is not None:
  199.             elem = elt.createAppendElement(ns, n)
  200.             self.set_attributes(elem, pyobj)
  201.             if kw.get('typed', self.typed) is True:
  202.                 self.set_attribute_xsi_type(elem)
  203.             
  204.             if self.mixed is True and self.mixed_aname is not None:
  205.                 if hasattr(pyobj, self.mixed_aname):
  206.                     textContent = getattr(pyobj, self.mixed_aname)
  207.                     if hasattr(textContent, 'typecode'):
  208.                         textContent.typecode.serialize_text_node(elem, sw, textContent)
  209.                     elif type(textContent) in _stringtypes:
  210.                         if debug:
  211.                             self.logger.debug('mixed text content:\n\t%s', textContent)
  212.                         
  213.                         elem.createAppendTextNode(textContent)
  214.                     else:
  215.                         raise EvaluateException('mixed test content in element (%s,%s) must be a string type' % (self.nspname, self.pname), sw.Backtrace(elt))
  216.                 elif debug:
  217.                     self.logger.debug('mixed NO text content in %s', self.mixed_aname)
  218.                 
  219.             
  220.         else:
  221.             elem = elt
  222.         if self.inline:
  223.             pass
  224.         elif not (self.inline) and self.unique:
  225.             raise EvaluateException('Not inline, but unique makes no sense. No href/id.', sw.Backtrace(elt))
  226.         elif n is not None:
  227.             self.set_attribute_id(elem, objid)
  228.         
  229.         if self.pyclass and type(self.pyclass) is type:
  230.             
  231.             f = lambda attr: getattr(pyobj, attr, None)
  232.         elif self.pyclass:
  233.             d = pyobj.__dict__
  234.             
  235.             f = lambda attr: d.get(attr)
  236.         else:
  237.             d = pyobj
  238.             
  239.             f = lambda attr: pyobj.get(attr)
  240.             if TypeCode.typechecks and type(d) != types.DictType:
  241.                 raise TypeError("Classless complexType didn't get dictionary")
  242.             
  243.         indx = 0
  244.         lenofwhat = len(self.ofwhat)
  245.         if debug:
  246.             self.logger.debug('element declaration (%s,%s)', self.nspname, self.pname)
  247.             if self.type:
  248.                 self.logger.debug('xsi:type definition (%s,%s)', self.type[0], self.type[1])
  249.             else:
  250.                 self.logger.warning('NO xsi:type')
  251.         
  252.         while indx < lenofwhat:
  253.             occurs = 0
  254.             what = self.ofwhat[indx]
  255.             if callable(what):
  256.                 what = what()
  257.             
  258.             if debug:
  259.                 self.logger.debug('serialize what -- %s', what.__class__.__name__)
  260.             
  261.             aname = what.aname
  262.             v = f(aname)
  263.             indx += 1
  264.             if what.minOccurs == 0 and v is None:
  265.                 continue
  266.             
  267.             whatTC = what
  268.             if whatTC.maxOccurs > 1 and v is not None:
  269.                 if type(v) not in _seqtypes:
  270.                     raise EvaluateException('pyobj (%s,%s), aname "%s": maxOccurs %s, expecting a %s' % (self.nspname, self.pname, what.aname, whatTC.maxOccurs, _seqtypes), sw.Backtrace(elt))
  271.                 
  272.                 for v2 in v:
  273.                     occurs += 1
  274.                     if occurs > whatTC.maxOccurs:
  275.                         raise EvaluateException('occurances (%d) exceeded maxOccurs(%d) for <%s>' % (occurs, whatTC.maxOccurs, what.pname), sw.Backtrace(elt))
  276.                     
  277.                     what = _get_type_or_substitute(whatTC, v2, sw, elt)
  278.                     if debug and what is not whatTC:
  279.                         self.logger.debug('substitute derived type: %s' % what.__class__)
  280.                     
  281.                     what.serialize(elem, sw, v2, **kw)
  282.                 
  283.                 if occurs < whatTC.minOccurs:
  284.                     raise EvaluateException('occurances(%d) less than minOccurs(%d) for <%s>' % (occurs, whatTC.minOccurs, what.pname), sw.Backtrace(elt))
  285.                     continue
  286.                 continue
  287.             
  288.             if v is not None or what.nillable is True:
  289.                 what = _get_type_or_substitute(whatTC, v, sw, elt)
  290.                 if debug and what is not whatTC:
  291.                     self.logger.debug('substitute derived type: %s' % what.__class__)
  292.                 
  293.                 what.serialize(elem, sw, v, **kw)
  294.                 continue
  295.             
  296.             raise EvaluateException('Got None for nillable(%s), minOccurs(%d) element (%s,%s), %s' % (what.nillable, what.minOccurs, what.nspname, what.pname, elem), sw.Backtrace(elt))
  297.  
  298.     
  299.     def setDerivedTypeContents(self, extensions = None, restrictions = None):
  300.         if extensions:
  301.             ofwhat = list(self.ofwhat)
  302.             if type(extensions) in _seqtypes:
  303.                 ofwhat += list(extensions)
  304.             else:
  305.                 ofwhat.append(extensions)
  306.         elif restrictions:
  307.             if type(restrictions) in _seqtypes:
  308.                 ofwhat = restrictions
  309.             else:
  310.                 ofwhat = (restrictions,)
  311.         else:
  312.             return None
  313.         self.ofwhat = tuple(ofwhat)
  314.         self.lenofwhat = len(self.ofwhat)
  315.  
  316.  
  317.  
  318. class Struct(ComplexType):
  319.     logger = _GetLogger('ZSI.TCcompound.Struct')
  320.     
  321.     def __init__(self, pyclass, ofwhat, pname = None, inorder = False, inline = False, mutable = True, **kw):
  322.         ComplexType.__init__(self, pyclass, ofwhat, pname = pname, inorder = inorder, inline = inline, mutable = mutable, **kw)
  323.         whats = map((lambda what: (what.nspname, what.pname)), self.ofwhat)
  324.         for idx in range(len(self.ofwhat)):
  325.             what = self.ofwhat[idx]
  326.             key = (what.nspname, what.pname)
  327.             if not isinstance(what, AnyElement) and what.maxOccurs > 1:
  328.                 raise TypeError, 'Constraint: no element can have a maxOccurs>1'
  329.             
  330.             if key in whats[idx + 1:]:
  331.                 raise TypeError, 'Constraint: No element may have the same name as any other'
  332.                 continue
  333.         
  334.  
  335.  
  336.  
  337. class Array(TypeCode):
  338.     logger = _GetLogger('ZSI.TCcompound.Array')
  339.     
  340.     def __init__(self, atype, ofwhat, pname = None, dimensions = 1, fill = None, sparse = False, mutable = False, size = None, nooffset = 0, undeclared = False, childnames = None, **kw):
  341.         TypeCode.__init__(self, pname, **kw)
  342.         self.dimensions = dimensions
  343.         self.atype = atype
  344.         if undeclared is False and self.atype[1].endswith(']') is False:
  345.             self.atype = (self.atype[0], '%s[]' % self.atype[1])
  346.         
  347.         if self.dimensions != 1:
  348.             raise TypeError('Only single-dimensioned arrays supported')
  349.         
  350.         self.fill = fill
  351.         self.sparse = sparse
  352.         self.mutable = mutable
  353.         self.size = size
  354.         self.nooffset = nooffset
  355.         self.undeclared = undeclared
  356.         self.childnames = childnames
  357.         if self.size:
  358.             t = type(self.size)
  359.             if t in _inttypes:
  360.                 self.size = (self.size,)
  361.             elif t in _seqtypes:
  362.                 self.size = tuple(self.size)
  363.             elif TypeCode.typechecks:
  364.                 raise TypeError('Size must be integer or list, not ' + str(t))
  365.             
  366.         
  367.         if not ofwhat:
  368.             pass
  369.         ofwhat = Any()
  370.         if TypeCode.typechecks:
  371.             if self.undeclared is False and type(atype) not in _seqtypes and len(atype) == 2:
  372.                 raise TypeError('Array type must be a sequence of len 2.')
  373.             
  374.             t = type(ofwhat)
  375.             if not isinstance(ofwhat, TypeCode):
  376.                 raise TypeError('Array ofwhat outside the TypeCode hierarchy, ' + str(ofwhat.__class__))
  377.             
  378.             if self.size:
  379.                 if len(self.size) != self.dimensions:
  380.                     raise TypeError('Array dimension/size mismatch')
  381.                 
  382.                 for s in self.size:
  383.                     if type(s) not in _inttypes:
  384.                         raise TypeError('Array size "' + str(s) + '" is not an integer.')
  385.                         continue
  386.                 
  387.             
  388.         
  389.         self.ofwhat = ofwhat
  390.  
  391.     
  392.     def parse_offset(self, elt, ps):
  393.         o = _find_arrayoffset(elt)
  394.         if not o:
  395.             return 0
  396.         
  397.         if not _offset_pat.match(o):
  398.             raise EvaluateException('Bad offset "' + o + '"', ps.Backtrace(elt))
  399.         
  400.         return int(o[1:-1])
  401.  
  402.     
  403.     def parse_position(self, elt, ps):
  404.         o = _find_arrayposition(elt)
  405.         if not o:
  406.             return None
  407.         
  408.         if o.find(',') > -1:
  409.             raise EvaluateException('Sorry, no multi-dimensional arrays', ps.Backtrace(elt))
  410.         
  411.         if not _position_pat.match(o):
  412.             raise EvaluateException('Bad array position "' + o + '"', ps.Backtrace(elt))
  413.         
  414.         return int(o[1:-1])
  415.  
  416.     
  417.     def parse(self, elt, ps):
  418.         href = _find_href(elt)
  419.         if href:
  420.             if _children(elt):
  421.                 raise EvaluateException('Array has content and HREF', ps.Backtrace(elt))
  422.             
  423.             elt = ps.FindLocalHREF(href, elt)
  424.         
  425.         if self.nilled(elt, ps):
  426.             return Nilled
  427.         
  428.         if not _find_arraytype(elt) and self.undeclared is False:
  429.             raise EvaluateException('Array expected', ps.Backtrace(elt))
  430.         
  431.         t = _find_type(elt)
  432.         if t:
  433.             pass
  434.         
  435.         offset = self.parse_offset(elt, ps)
  436.         v = []
  437.         vlen = 0
  438.         if offset and not (self.sparse):
  439.             while vlen < offset:
  440.                 vlen += 1
  441.                 v.append(self.fill)
  442.         
  443.         for c in _child_elements(elt):
  444.             item = self.ofwhat.parse(c, ps)
  445.             if not self.parse_position(c, ps):
  446.                 pass
  447.             position = offset
  448.             if self.sparse:
  449.                 v.append((position, item))
  450.             else:
  451.                 while offset < position:
  452.                     offset += 1
  453.                     v.append(self.fill)
  454.                 v.append(item)
  455.             offset += 1
  456.         
  457.         return v
  458.  
  459.     
  460.     def serialize(self, elt, sw, pyobj, name = None, childnames = None, **kw):
  461.         debug = self.logger.debugOn()
  462.         if debug:
  463.             self.logger.debug('serialize: %r' % pyobj)
  464.         
  465.         if self.mutable is False and sw.Known(pyobj):
  466.             return None
  467.         
  468.         objid = _get_idstr(pyobj)
  469.         (ns, n) = self.get_name(name, objid)
  470.         el = elt.createAppendElement(ns, n)
  471.         if self.nillable is True and pyobj is None:
  472.             self.serialize_as_nil(el)
  473.             return None
  474.         
  475.         self.set_attributes(el, pyobj)
  476.         if not self.unique:
  477.             pass
  478.         unique = kw.get('unique', False)
  479.         if unique is False and sw.Known(pyobj):
  480.             self.set_attribute_href(el, objid)
  481.             return None
  482.         
  483.         if kw.get('typed', self.typed) is True:
  484.             self.set_attribute_xsi_type(el, **kw)
  485.         
  486.         if self.unique is False:
  487.             self.set_attribute_id(el, objid)
  488.         
  489.         offset = 0
  490.         if self.sparse is False and self.nooffset is False:
  491.             offset = 0
  492.             end = len(pyobj)
  493.             while offset < end and pyobj[offset] == self.fill:
  494.                 offset += 1
  495.             if offset:
  496.                 el.setAttributeNS(SOAP.ENC, 'offset', '[%d]' % offset)
  497.             
  498.         
  499.         if self.undeclared is False:
  500.             el.setAttributeNS(SOAP.ENC, 'arrayType', '%s:%s' % (el.getPrefix(self.atype[0]), self.atype[1]))
  501.         
  502.         if debug:
  503.             self.logger.debug('ofwhat: %r' % self.ofwhat)
  504.         
  505.         d = { }
  506.         if not childnames:
  507.             pass
  508.         kn = self.childnames
  509.         if kn:
  510.             d['name'] = kn
  511.         elif not self.ofwhat.aname:
  512.             d['name'] = 'element'
  513.         
  514.         if self.sparse is False:
  515.             for e in pyobj[offset:]:
  516.                 self.ofwhat.serialize(el, sw, e, **d)
  517.             
  518.         else:
  519.             position = 0
  520.             for pos, v in pyobj:
  521.                 if pos != position:
  522.                     el.setAttributeNS(SOAP.ENC, 'position', '[%d]' % pos)
  523.                     position = pos
  524.                 
  525.                 self.ofwhat.serialize(el, sw, v, **d)
  526.                 position += 1
  527.             
  528.  
  529.  
  530. if __name__ == '__main__':
  531.     print _copyright
  532.  
  533.